using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;

using tp1.Entidades;

namespace tp1.Escena
{
    enum TipoCaja { CajaA, CajaB }

    class Caja
    {
        protected Punto _centro;
        protected Punto _escalado;
        protected bool _sujeta = true;
        public Caja() { }

        public bool HitTest(Punto contacto)
        {
            if (contacto.X > (_centro.X - 20 * _escalado.X))
                if (contacto.X < (_centro.X + 20 * _escalado.X))
                    if (contacto.Y < (_centro.Y + 20 * _escalado.Y))
                        if (contacto.Y > (_centro.Y - 20 * _escalado.Y))
                            return true;
            return false;
        }


        public virtual bool CajaEnSuelo(Punto puntoSuelo) { return false; }


        public bool HitTestCamion(Punto inicioAcoplado, Punto finAcoplado)
        {
            if ((_centro.X - 30 * _escalado.X) > inicioAcoplado.X)
                if ((_centro.X - 30 * _escalado.X) < finAcoplado.X)
                    if (inicioAcoplado.Y < (_centro.Y))
                        if (inicioAcoplado.Y > (_centro.Y - 45 * _escalado.Y))
                            return true;
            return false;
        }

        public Punto Centro
        {
            set { _centro = value; }
            get { return _centro; }
        }
        public bool Sujeta
        {
            get { return _sujeta; }
            set
            {
                _sujeta = value;
                _ySuelta = Centro.Y;
                _tiempo = 0;
            }
        }

        public static Caja CrearCaja(TipoCaja tipo, Punto centro, Punto escalado)
        {
            switch (tipo)
            {
                case TipoCaja.CajaA:
                    return new CajaA(centro, escalado);
                case TipoCaja.CajaB:
                    return new CajaB(centro, escalado);
                default:
                    return null;
            }
        }


        public virtual void Dibujar() { }


        private double _ySuelta;
        private int _tiempo;

        public void Bajar()
        {
            if (!Sujeta && Centro.Y > 70)
            {
                double nuevoY = _ySuelta - 0.5 * 9.8 * _tiempo * _tiempo;
                Centro = new Punto(Centro.X, Math.Max(70, nuevoY));
                _tiempo++;
            }
        }
    }
}
